﻿using ATEC.GeometryNET;
using ATEC.ATDataCoreNET;
using SSDPNET;
using SSDPNET.DataCore;
using System.Windows.Forms;
using ATEC.ATDataCoreNET.ATObjects;
using System;
using ATEC.ATCore;

/// <summary>
/// 类名：CreateText
/// 分类：玄镜BIM图形平台/C#开发/示例代码/文本对象
/// 功能：展示如何创建、查询和修改文本对象，包括文字样式设置、文本块创建和文本属性修改等操作。
/// 关键类及说明：
///     - ATTextStyle：文字样式类，用于定义文本的显示属性
///     - TextBlock：文本块类，用于创建和管理文本内容
///     - TextEdit：文本编辑类，提供文本修改功能
///     - ATCaret：文本光标类，用于文本定位和范围选择
/// </summary>
namespace TextExample
{
    public class CreateText
    {
        private static ATObject obj;
        private static string styName = "文字样式一";

        /// <summary>
        /// 方法名：CreateTextStyle
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/文本对象/样式
        /// 功能：创建或获取指定名称的文字样式，设置样式的基本属性。
        /// 参数：
        ///     - nm：string，文字样式的名称
        /// 返回值：ATTextStyle，创建或获取的文字样式对象
        /// 说明：
        ///     如果指定名称的样式已存在，则直接返回该样式；
        ///     否则创建新样式并设置宽度、高度、颜色等属性。
        /// </summary>
        public static ATTextStyle CreateTextStyle(string nm)
        {
            ATProject activeProj = ATEC.ATCore.Session.Entity.GetActiveATProject();

            // 查找是否已存在
            ATTextStyle txtStyle = ATTextStyle.GetByName(nm, activeProj);
            if (txtStyle != null)
            {
                return txtStyle;
            }

            // 新建
            txtStyle = new ATTextStyle(nm, activeProj);
            {
                // 属性 // 宽、高、颜色
                txtStyle.SetProperty(TextStyleProperty.Width, (double)500); // 单位 uor
                txtStyle.SetProperty(TextStyleProperty.Height, (double)500);
                txtStyle.SetProperty(TextStyleProperty.ColorFlag, true);
                txtStyle.SetProperty(TextStyleProperty.Color, (UInt32)3);
            }
            txtStyle.Add(activeProj);

            return txtStyle;
        }

        /// <summary>
        /// 方法名：Text_Create
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/文本对象/创建
        /// 功能：创建文本块对象，设置其位置、样式和内容。
        /// 参数：无
        /// 返回值：无
        /// 关键类及说明：
        ///     - TextBlockProperties：文本块属性类，定义文本块的基本特性
        ///     - ParagraphProperties：段落属性类，控制文本对齐方式等
        ///     - RunProperties：文本运行属性类，控制文本的具体显示特征
        /// </summary>
        public static void Text_Create()
        {
            //获得当前激活的模型空间
            ATScene scene = Session.Entity.GetActiveATScenes();
            //创建文本块属性
            TextBlockProperties tbProp = new TextBlockProperties(scene)
            {
                IsViewIndependent = false,
                IsVertical = false,//设置文字竖直or水平
            };

            //创建文本段落属性
            ParagraphProperties paraProp = new ParagraphProperties(scene);
            {
                paraProp.Justification = TextObjectJustification.CenterMiddle;
                paraProp.SetLineSpacingType(ATLineSpacingType.AtLeast);
            }

            ATTextStyle textStyle = CreateTextStyle(styName); // 创建文字样式
            RunProperties runProp = RunPropertiesExtension.Create(textStyle, scene); // 一“截”文字的属性
            TextBlock textBlock = new TextBlock(tbProp, paraProp, runProp, scene); //创建文本块
            {
                textBlock.AppendText("这是一个文本块示例");

                XPoint3d ptOr = new XPoint3d(10000, 0, 0);
                textBlock.SetUserOrigin(ptOr); //定义文本块所在位置
                textBlock.SetOrientation(XMatrix3d.Identity); // 旋转矩阵
            }

            //将text转换为obj 并添加到scene中
            TextHandlerBaseExtension.CreateObject(out obj, textBlock);
            obj.AddToScene();
        }


        /// <summary>
        /// 方法名：QueryTextInfo
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/文本对象/查询
        /// 功能：查询文本对象的基本信息，包括文本样式的高度、宽度和字符数量。
        /// 参数：无
        /// 返回值：无
        /// 说明：
        ///     通过文字样式名称获取样式对象，并输出相关尺寸信息；
        ///     同时获取并显示文本中的字符总数。
        /// </summary>
        public static void QueryTextInfo()
        {
            // 根据名字查询文字样式，进而获取文本高度和宽度
            var textStyle = ATTextStyle.GetByName(styName, Session.Entity.GetActiveATProject());
            if (textStyle != null)
            {
                double textHeight = textStyle.GetHeight(Session.Entity.GetActiveATScenes(), false);
                double textWidth = textStyle.GetWidth(Session.Entity.GetActiveATScenes(), false);
                string sizeStr = "文本高度" + textHeight.ToString() + "," + "文本宽度" + textWidth.ToString();
                ATDlgFuncs.DialogDmsgsPrint(sizeStr); // 将获取的文本高度和文本宽度打印出来
            }

            //文本字符个数
            int num = GetChracterCount();
            string numStr = "文本字符个数" + num.ToString();
            ATDlgFuncs.DialogDmsgsPrint(numStr);
        }

        /// <summary>
        /// 方法名：GetChracterCount
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/文本对象/工具
        /// 功能：计算文本对象中的字符数量。
        /// 参数：无
        /// 返回值：int，文本中的字符总数
        /// 关键类及说明：
        ///     - ATCaret：文本光标类，用于遍历文本内容
        /// </summary>
        public static int GetChracterCount()
        {
            //获取文本对象首文本部分的值
            TextBlock tb = TextHandlerBaseExtension.GetFirstTextPartValue(obj);
            if(tb==null)
            {
                return 0;
            }
            //创建文本块对象的起始字符
            ATCaret pCaretStart = tb.CreateStartATCaret();
            //创建文本块对象的终止字符
            ATCaret pCaretEnd = tb.CreateEndATCaret();
            int  totalNum = 0;
            ATECStatus status = ATECStatus.Success;
            while (ATECStatus.Success == status)
            {
                //移动到下一个字符
                status = pCaretStart.MoveToNextCharacter();
                totalNum++;
            }
            totalNum--;

         
            return totalNum;
        }
        /// <summary>
        /// 方法名：Text_Modify
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/文本对象/修改
        /// 功能：修改文本对象的部分内容样式，包括设置下划线、颜色和粗体等属性。
        /// 参数：无
        /// 返回值：无
        /// 说明：
        ///     使用ATCaret定位要修改的文本范围（第3到第6个字符）；
        ///     创建新的文字样式并应用到选定范围；
        ///     更新场景中的文本对象显示。
        /// </summary>
        public static void Text_Modify()
        {     
            //获取文本编辑          
            TextEdit edit = TextEdit.GetAsTextEdit(obj);
            if (edit == null)
            {
                return ;
            }
            //获取文本对象首文本部分的值
            TextBlock tb = TextHandlerBaseExtension.GetFirstTextPartValue(obj);
            if (tb == null)
            {
                return ;
            }

       
            //创建文本块对象的起始字符
            ATCaret caretStart = tb.CreateStartATCaret();
            //创建文本块对象的终止字符
            ATCaret caretEnd = tb.CreateStartATCaret();
            //下标范围[2, 6), 即三个字符到第六个字符
            caretStart.MoveToIthCharater(2);
            caretEnd.MoveToIthCharater(6);

            //创建现场本样式，并应用
            ATTextStyle textStyle = caretStart.CreateEffectiveTextStyle();   
            //设置下划线属性       
            textStyle.SetProperty(TextStyleProperty.Underline, true);
            textStyle.SetProperty(TextStyleProperty.ColorFlag, true);
            UInt32 color = 1;
            textStyle.SetProperty(TextStyleProperty.Color, color);
            textStyle.SetProperty(TextStyleProperty.Bold, true);
            //获取字部分的ID
            TextPartIdCollection collection = edit.GetTextPartIds(new TextQueryOptions());

            // 更新
            if (collection.Count > 0)
            {
                TextPartId prt = collection[0];
                tb.ApplyTextStyleToRunsInRange(textStyle, true, caretStart, caretEnd);
                tb.PerformLayout();
                edit.ReplaceTextPart(prt, tb);
                edit.ReplaceInScene(obj);
            }   

        }
    }

    /// <summary>
    /// 类名：CaretExtensions
    /// 分类：玄镜BIM图形平台/C#开发/示例代码/文本对象/扩展
    /// 功能：为ATCaret类提供扩展方法，简化文本光标的移动操作。
    /// 关键类及说明：
    ///     - ATCaret：文本光标类，用于文本定位
    /// </summary>
    internal static class CaretExtensions
    {
        /// <summary>
        /// 方法名：MoveToIthCharater
        /// 功能：将文本光标向前移动指定步数。
        /// 参数：
        ///     - iterator：ATCaret，要移动的光标对象
        ///     - steps：int，要移动的步数
        /// </summary>
        public static void MoveToIthCharater(this ATCaret iterator, int steps)
        {
            for (int i = 0; i < steps; i++)
            {
                iterator.MoveToNextCharacter();
            }
        }
    }
}
